import pandas as pd

# 1. 读取Excel文件（用openpyxl引擎，保留原始数据结构）
df = pd.read_excel(
    "D:\\PyWorks\\CEEAAforBEEE\\2023_NewMajor.xlsx",
    sheet_name="Sheet1",
    engine="openpyxl",  # 关键：openpyxl支持读取合并单元格范围
    header=None  # 暂不设置表头，避免合并行被误判为表头
)

# 对于行索引为1，提取该行内容的前四个字符，作为年份
if len(df.index) > 1:
    year = str(df.iloc[1, 0])[:4]  # 提取前四个字符
    print(f"提取到的年份: {year}")
else:
    print("DataFrame中没有足够的行来提取年份")
    year = None

# 新建一个dataframe，用于存储处理后的数据，列标题为df第三行的数据，数据为df第四行开始的数据
dfMajor = pd.DataFrame(columns=df.iloc[2].tolist(), data=df.iloc[3:].values)
# 去掉列名第5和第6个字符里面的换行符
dfMajor.columns = dfMajor.columns.str.replace('\n', '')
print(dfMajor.head(10))

# 2. 定位合并行（特征：首列有值，且该行非空值数量≤1，其余列均为NaN）
# 假设合并行是“省份抬头”（如“北京市”“河北省”），仅首列（A列）有值
merge_rows = []
for idx, row in dfMajor.iterrows():
    # 统计该行非NaN值的数量
    non_null_count = row.notna().sum()
    # 合并行条件：非空值≤1，且首列（A列，索引0）有值（排除纯空行）
    if non_null_count <= 1 and pd.notna(row.iloc[0]):
        merge_rows.append({
            "行索引": idx,
            "合并行内容": row.iloc[0],  # 合并单元格的实际内容（首列值）
            "非空列数": non_null_count
        })

# 3. 转换为DataFrame查看合并行结果
merge_df = pd.DataFrame(merge_rows)
print("Excel中的合并行（省份抬头行）：")
print(merge_df)  # 前10个合并行（如北京市、天津市等）

# 4. 在dfMajor中添加合并行内容列
# 创建一个新的Series来存储省份信息，避免直接修改DataFrame导致的结构问题
province_series = pd.Series(index=dfMajor.index, dtype=object)

# 遍历所有行，填充合并行内容
current_merge_content = None
for idx, row in dfMajor.iterrows():
    # 如果是合并行，更新当前合并内容
    if idx in merge_df['行索引'].values:
        current_merge_content = merge_df.loc[merge_df['行索引'] == idx, '合并行内容'].values[0]
    # 填充当前行的合并内容
    province_series.loc[idx] = current_merge_content

# 将省份信息添加到DataFrame中
dfMajor = dfMajor.assign(省份=province_series)
dfMajor['年份'] = year  # 年份列，所有值为提取到的年份

# 删除合并行（行索引在merge_df中的值）
dfMajor = dfMajor[~dfMajor.index.isin(merge_df['行索引'])]
# 判断序号是不是从1到最后一行
if dfMajor.index.is_monotonic_increasing:
    print("序号从1到最后一行")
else:
    print("序号不是从1到最后一行")

print("\n添加合并行内容后的完整DataFrame：")
print(dfMajor.head(20))  # 显示前几行查看效果

# 将dfMajor的序号列转换为整数类型，处理各种数据类型情况
# 首先检查序号列的数据类型
print(f"序号列原始数据类型: {dfMajor['序号'].dtype}")

# 安全地将序号列转换为整数类型
# 使用pd.to_numeric将非数字值转换为NaN
numeric_series = pd.to_numeric(dfMajor['序号'], errors='coerce')

# 查找转换后为NaN的行（即原始数据不是数字的行）
non_numeric_rows = dfMajor[numeric_series.isna()]
if not non_numeric_rows.empty:
    print("序号列中不是有效数字的行:")
    print(non_numeric_rows)

# 删除non_numeric_rows的行索引对应的行
dfMajor = dfMajor.drop(non_numeric_rows.index)

# # 用0填充NaN值，然后转换为整数
# numeric_series = numeric_series.fillna(0).astype(int)

# # 将转换后的值赋回DataFrame
# # 注意：使用dfMajor.index确保索引匹配
# dfMajor['序号'] = numeric_series.reindex(dfMajor.index, fill_value=0)

# 将数据导出为excel文件
# 如果该文件存在，则以时间和日期来作为sheet的名称
import datetime
now = datetime.datetime.now()
sheet_name = now.strftime("%Y%m%d_%H%M%S")
dfMajor.to_excel("D:\\PyWorks\\CEEAAforBEEE\\2024_NewMajor_Processed.xlsx", index=False, sheet_name=sheet_name)

